package com.smxpt.Dao;

import com.smxpt.Aspect.MyAspect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//JDK代理类，将切面切入到切入点后形成的新的类
public class MyProxy implements InvocationHandler {
    //对目标对象进行关联
    private UserDao userDao;
    //使用方法创建UserDao对象的代理对象，也就是通过这个方法得到增强后的对象
    public Object createProxy(UserDao userDao) {
        //首先对参数进行赋值
        this.userDao = userDao;
        //JDK动态代理对象需要三个参数
        //1.类加载器（被加载的对象）
        ClassLoader classLoader = MyProxy.class.getClassLoader();
        //2.被代理对象实现所有的接口
        Class<?>[] classes = userDao.getClass().getInterfaces();
        //3.使用代理类进行增强处理，返回的就是代理对象（处理器，增强功能的具体实现）
        return Proxy.newProxyInstance(classLoader, classes, this);
        //this代表当前接口的具体实现方法
    }

    /*
     * proxy:被代理的对象
     * method：将要被执行的方法的信息（反射机制）
     * args：执行方法所需要的参数
     * */

    //进行增强处理过程
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //1.创建切面对象
        MyAspect myAspect = new MyAspect();
        //2.进行切入点前增强处理操作
        myAspect.check_Permissions();
        //3.保证目标类的对象调用进来，确保主要业务功能方法执行
        Object obj = method.invoke(userDao, args);
        //4.进行切入点后增强处理操作
        myAspect.log();
        //返回增强后的目标方法
        return obj;
    }
}
